/**
 * 定义config下面的hsf配置文件里面的interfaceName如何跳转到app/proxy里面对应文件
 */
const vscode = require('vscode');
const path = require('path');
const fs = require('fs');
const util = require('../util');

/**
 * 查找文件定义的provider，匹配到了就return一个location，否则不做处理
 * 最终效果是，当按住Ctrl键时，如果return了一个location，字符串就会变成一个可以点击的链接，否则无任何效果
 * @param {*} document 
 * @param {*} position 
 * @param {*} token 
 */
function provideDefinition(document, position, token) {
    const fileName    = document.fileName;
    const workDir     = path.dirname(fileName);
    const line        = document.lineAt(position);
    const projectPath = util.getProjectPath(document);
    
    // 只对config文件夹下的文件进行匹配
    if (workDir.indexOf(`${projectPath}/config`) < 0) return;
    // 只要是 com. 开头并且引号括起来的字符串都认为是某个interfaceName
    const result = /'(com\.[^']+?)'/g.exec(line.text);
    if (!result) return;
    // 其实这里匹配并不严格，当同一行有多个这样的字符串时会不准确，后面有时间再完善
    const interfaceName = result[1];
    const temp = interfaceName.split('.');
    // 通过这种方式查找不一定准确，后面有时间改成语法分析的方式
    const destPath = `${projectPath}/app/proxy/${temp[temp.length-1]}.js`;
    if (fs.existsSync(destPath)) {
        util.addGoldLog('definition-interface-name');
        return new vscode.Location(vscode.Uri.file(destPath), new vscode.Position(0, 0));
    } else {
        console.warn('不存在文件：' + destPath);
    }
}
module.exports = function(context) {
    // 注册如何实现跳转到定义
    context.subscriptions.push(vscode.languages.registerDefinitionProvider(['javascript', 'javascriptreact'], {
        provideDefinition
    }));
};